package com.briup.es.service.impl;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePayModel;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.briup.es.config.alipay.AlipayConfig;
import com.briup.es.config.exception.ServiceException;
import com.briup.es.config.response.ResultCode;
import com.briup.es.domain.bean.Order;
import com.briup.es.domain.dto.OrderPayDto;
import com.briup.es.domain.dto.PaySuccessDto;
import com.briup.es.mapper.OrderMapper;
import com.briup.es.service.OrderPayService;
import com.briup.es.utils.AssertUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class OrderPayServiceImpl implements OrderPayService {

    @Resource
    private AlipayConfig alipayConfig;
    @Resource
    private OrderMapper orderMapper;

    @Override
    public String pay(OrderPayDto payDto) {
        // 确定订单是否满足某一个状态条件
        String orderId = payDto.getOrderId();
        int count = orderMapper.countStatusById(orderId, 1);
        AssertUtil.isTrue(count == 1,
                ResultCode.ORDER_STATUS_IS_NOT_SUPPORT);

        // 当订单支持支付时，开始使用支付宝沙箱进行支付
        // 新建alipay客户端
        AlipayClient alipayClient = new DefaultAlipayClient(
                alipayConfig.getAlipayGateway(),
                alipayConfig.getAppId(),
                alipayConfig.getAppSecretKey(), "json",
                alipayConfig.getCharset(),
                alipayConfig.getAlipayPublicKey(), "RSA2"
        );

        //实例化具体API对应的request类
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();

        // 设置支付订单的业务参数
        AlipayTradePayModel payModel = new AlipayTradePayModel();
        // 设置支付的订单编号
        payModel.setOutTradeNo(orderId);
        // 设置待支付的订单总金额
        payModel.setTotalAmount(payDto.getTotalPrice());
        // 设置订单名称
        payModel.setSubject("购买图书");
        // 订单描述，使用当前时间的时间戳进行描述
        payModel.setBody(System.currentTimeMillis() + "");
        // 产品码
        payModel.setProductCode("FAST_INSTANT_TRADE_PAY");

        // 将支付订单的参数模型放入到 支付请求中
        request.setBizModel(payModel);
        // 设置回调地址
        request.setReturnUrl(payDto.getPathUrl());

        // 发送支付请求，可以获取支付的结果
        String result;
        try {
            result = alipayClient.pageExecute(request)
                    .getBody();
        } catch (AlipayApiException e) {
            throw new ServiceException("支付失败，原因:" + e.getMessage());
        }

        return result;
    }

    @Override
    public void paySuccess(PaySuccessDto paySuccessDto) {
        // 校验订单的状态
        // 确定订单当前是否为未支付的状态，如果是则继续操作
        String orderId = paySuccessDto.getOrderId();
        int count = orderMapper.countStatusById(orderId, 1);
        AssertUtil.isTrue(count == 1,
                ResultCode.ORDER_STATUS_IS_NOT_SUPPORT);

        // 修改订单的数据
        Order order = Order.builder()
                .id(orderId)
                // 设置订单的支付时间
                .payDate(paySuccessDto.getPayDate())
                // 设置订单的支付方式
                .payWay(paySuccessDto.getPayWay())
                // 将订单的状态改为已支付
                .status(2)
                .build();
        orderMapper.paySuccess(order);
    }
}
